// 接口是用来描述对象
// 接口是对类的一部分行为的抽象


// interface

interface IPerson {
    readonly name: string,//readonly表示只读属性
    age: number,
    sex: string,
    wife?: string, //？表示可选属性
    // [propName: string]: string|number;//额外属性  propName可以是任意名字
    nest: {
        // 通过nest解决，在对象中添加任意属性都会躲过检查，通过点语法添加任意属性的问题
        [propName: string]: string | number;
    }
}
// 对象要与接口属性相同
var person: IPerson = {
    name: '张三',
    age: 18,
    sex: 'male',
    nest: {
        a: 12
    }
}
// readonly修饰符修饰表示该值不可以修改，只读
// person.name = '李四'
console.log(person)


// 函数类型
function test(a: number, b: number): number {
    return a + b;
}
interface ITest {
    (a: number, b: number): number
}
var test1: ITest = (a, b) => {
    return a + b
}
var test2: (a: number, b: number) => number = (a, b) => {
    return a + b
}


// 可索引类型
interface IlikeArray {
    length: number
}
//extends继承另一个接口
interface IArray extends IlikeArray {
    [index: number]: string | number
}
var arr1: (number | string)[] = [1, 2, 3, '4']
var arr2: IArray = [1, 2, 3, '4']

interface IArray1 extends Array<number | string> {
    0: number,
    1?: string,
    length: 2 | 1
}
// 元组特点：数组长度确定的，顺序不可变的
var arr3: [number, string] = [123, '123']
var arr4: IArray1 = [123, '123']
